package chapter05

/**
 * 闭包和柯里化的实现
 */
object Demo09_ClosureAndCurrying {
  def main(args: Array[String]): Unit = {
    def add(a: Int , b: Int): Int = {
      a + b
    }

    //1、考虑固定一个加数的场景
    def addByFour(b: Int): Int = {
      4 + b
    }
    //2、扩展固定一个加数的场景
    def addByFive(b: Int): Int = {
      5 + b
    }
    //3、将固定加数作为另一个参数传入，但是是作为“第一层参数”传入
    def addByFour1(): Int => Int = {
      val a = 4
      def addB(b: Int): Int = {
        a + b
      }
      addB
    }

    def addByA(a: Int): Int => Int = {
      def addB(b: Int): Int = {
        a + b
      }
      addB
    }
    println(addByA(15)(44))

    val addByFour2 = addByA(4)

    println(addByFour2(8))

    //4、lambda表达式简写
    def addByA3(a: Int): Int => Int = a + _

    //5、柯里化
    def addCurrying(a: Int)(b: Int): Int = {
      a + b
    }
    println(addCurrying(35)(24))

  }
}
